package pers.chao.tool.date;

import cn.hutool.core.date.CalendarUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;

import java.util.Calendar;
import java.util.Date;

/**
 * Description: 日期常用工具
 *
 * @author W.Chao
 * @date 2020/11/11 0:49
 **/
public final class EasyDateUtil {
	private EasyDateUtil() {
	}

	/**
	 * 获取某天的开始时间
	 *
	 * @param date
	 * @return
	 */
	public static DateTime beginOfDay(Date date) {
		return DateUtil.beginOfDay(date);
	}

	/**
	 * 获取某周的开始时间
	 *
	 * @param date
	 * @param isMondayAsFirstDay 第一天是否为周一
	 * @return
	 */
	public static DateTime beginOfWeek(Date date, boolean isMondayAsFirstDay) {
		return DateUtil.beginOfWeek(date, isMondayAsFirstDay);
	}

	/**
	 * 获取某月的开始时间
	 *
	 * @param date
	 * @return
	 */
	public static DateTime beginOfMonth(Date date) {
		return DateUtil.beginOfMonth(date);
	}

	/**
	 * 获取某年的开始时间
	 *
	 * @param date
	 * @return
	 */
	public static DateTime beginOfYear(Date date) {
		return DateUtil.beginOfYear(date);
	}

	/**
	 * 计算两个日期相差的时长
	 *
	 * @param begin
	 * @param end
	 * @param unit
	 * @param isAbs 是否保留绝对值
	 * @return
	 */
	public static Long between(Date begin, Date end, DateUnit unit, boolean isAbs) {
		return DateUtil.between(begin, end, unit, isAbs);
	}

	/**
	 * 计算两个日期相差的天数
	 *
	 * @param begin
	 * @param end
	 * @param ignore 是否忽略时分秒
	 * @return
	 */
	public static Long between(Date begin, Date end, boolean ignore) {
		return DateUtil.betweenDay(begin, end, ignore);
	}

	/**
	 * 计算两个日期相差的毫秒数
	 *
	 * @param begin
	 * @param end
	 * @return
	 */
	public static Long between(Date begin, Date end) {
		return DateUtil.betweenMs(begin, end);
	}

	/**
	 * 判断日期1是否在日期2前面
	 *
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static boolean compare(Date date1, Date date2) {
		return DateUtil.compare(date1, date2) <= 0;
	}

	/**
	 * 转换为DateTime对象
	 *
	 * @return
	 */
	public static DateTime current() {
		return DateUtil.date();
	}

	/**
	 * 转换为DateTime对象
	 *
	 * @param calendar
	 * @return
	 */
	public static DateTime current(Calendar calendar) {
		return DateUtil.date(calendar);
	}

	/**
	 * 转换为DateTime对象
	 *
	 * @param date
	 * @return
	 */
	public static DateTime current(Date date) {
		return DateUtil.date(date);
	}

	/**
	 * 转换为DateTime对象
	 *
	 * @param date
	 * @return
	 */
	public static DateTime current(Long date) {
		return DateUtil.date(date);
	}

	/**
	 * 转换为Calendar对象
	 *
	 * @return
	 */
	public static Calendar calendar() {
		return CalendarUtil.calendar();
	}

	/**
	 * 转换为Calendar对象
	 *
	 * @param dateTime
	 * @return
	 */
	public static Calendar calendar(DateTime dateTime) {
		return CalendarUtil.calendar(dateTime);
	}

	/**
	 * 转换为Calendar对象
	 *
	 * @param date
	 * @return
	 */
	public static Calendar calendar(Date date) {
		return CalendarUtil.calendar(date);
	}

	/**
	 * 转换为Calendar对象
	 *
	 * @param date
	 * @return
	 */
	public static Calendar calendar(Long date) {
		return CalendarUtil.calendar(date);
	}

	/**
	 * 返回指定日期是这个日期所在月份的第几天
	 *
	 * @param date
	 * @return
	 */
	public static int dayOfMonth(Date date) {
		return DateUtil.dayOfMonth(date);
	}

	/**
	 * 返回指定日期是这个日期所在周的第几天
	 *
	 * @param date
	 * @return 1为周日，2为周一
	 */
	public static int dayOfWeek(Date date) {
		return DateUtil.dayOfWeek(date);
	}

	/**
	 * 返回指定日期是这个日期所在年份的第几天
	 *
	 * @param date
	 * @return
	 */
	public static int dayOfYear(Date date) {
		return DateUtil.dayOfYear(date);
	}

	/**
	 * 获取某天的结束时间
	 *
	 * @param date
	 * @return
	 */
	public static DateTime endOfDay(Date date) {
		return DateUtil.endOfDay(date);
	}

	/**
	 * 获取某周的结束时间
	 *
	 * @param date
	 * @param isSundayAsLastDay 周日是否为最后一天
	 * @return
	 */
	public static DateTime endOfWeek(Date date, boolean isSundayAsLastDay) {
		return DateUtil.endOfWeek(date, isSundayAsLastDay);
	}

	/**
	 * 获取某月的结束时间
	 *
	 * @param date
	 * @return
	 */
	public static DateTime endOfMonth(Date date) {
		return DateUtil.endOfMonth(date);
	}

	/**
	 * 获取某年的结束时间
	 *
	 * @param date
	 * @return
	 */
	public static DateTime endOfYear(Date date) {
		return DateUtil.endOfYear(date);
	}

	/**
	 * 是否为上午
	 * @param date
	 * @return
	 */
	public static boolean isAm(Date date){
		return DateUtil.isAM(date);
	}

	/**
	 * 指定日期是否在指定日期范围内
	 * @param date
	 * @param begin
	 * @param end
	 * @return
	 */
	public static boolean isIn(Date date, Date begin, Date end){
		return DateUtil.isIn(date, begin, end);
	}

	/**
	 * 是否是闰年
	 * @param date
	 * @return
	 */
	public static boolean isLeapYear(Date date){
		return DateUtil.isLeapYear(CalendarUtil.calendar(date).get(Calendar.YEAR));
	}

	/**
	 * 是否是闰年
	 * @param year
	 * @return
	 */
	public static boolean isLeapYear(int year){
		return DateUtil.isLeapYear(year);
	}

	/**
	 * 是否是同一月
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static boolean isSameMonth(Date date1, Date date2) {
		return DateUtil.isSameMonth(date1, date2);
	}
}
